
"""
Python 发送带自签名证书的 https 请求
    https://blog.csdn.net/weixin_37988176/article/details/109415915

    在拥有 .pfx 文件和其密码(若有加密)的前提下进行 https 请求
    所有方法均忽略了服务器响应包的签名认证，即只对请求使用自签名证书进行加密。

    1. requests-pkcs12 使用 .pfx

        pip install requests-pkcs12

        import requests_pkcs12

        resp = requests_pkcs12.post(
                    'https://www.example.com/path',
                    data='payload',
                    pkcs12_filename='server.pfx',
                    pkcs12_password='password',
                    verify=False) # 若需要对响应包进行验证，则需要给 verify 传参

    2. requests 使用 .crt 和 .key

        import requests

        resp = requests.post(
                    'https://www.example.com/path',
                    data='payload',
                    cert=('example.crt', 'example.key'),
                    verify=False) # 若需要对响应包进行验证，则需要给 verify 传参


        example.key 和 example.crt 由 .pfx 文件使用 openssl 转换而来(若 pfx 有密码则会提示输入密码)：
            openssl pkcs12 -in example.pfx -nocerts -nodes -out example.key
            openssl pkcs12 -in example.pfx -clcerts -nokeys -out example.crt

    3. httplib.HTTPSConnection 使用 .crt 和 .key

        import httplib
        import ssl

        ssl._create_default_https_context = ssl._create_unverified_context # 指明不验证响应包

        conn = httplib.HTTPSConnection(
                    "www.example.com",
                    port=443,
                    key_file='example.key',
                    cert_file='example.crt')

        conn.request('POST', '/path', body='payload')

        retCreateCon = conn.getresponse()

"""

import requests_pkcs12


def sign1():
    resp = requests_pkcs12.post(
        'http://9.176.47.41/creditreference/',
        data='payload',
        pkcs12_filename=r"F:\Download\HMCCB_daiq.pfx",
        pkcs12_password='daiq123hmccb',
        verify=False)  # 若需要对响应包进行验证，则需要给 verify 传参

    print(resp.text)


def sign2():

    """
    requests 带证书密码HTTPS双向认证请求
        https://www.jianshu.com/p/c8835106bd25

        首先安装requests_pkcs12模块
        pip install requests_pkcs12

        请求后一直报HTTP Basic Auth认证错误，网上找到了以下解决办法，
            需要进行HTTP Basic Auth认证
            首先，HttpBasic模式要求传输的用户名密码使用Base64模式进行加密。
            如用户名是 "admin" ，密码是“ admin”，
            则将字符串"admin:admin"使用Base64编码算法加密。
            加密结果可能是：YWtaW46YWRtaW4=
        转自：https://blog.csdn.net/hanxiaotongtong/article/details/108035688

    """

    header = {"Content-Type": "text/xml; charset=UTF-8", 'Connection': 'close',
              "Authorization": "Basic SE1DQ0JfZGFpcTpEYWlxMDAwNQ=="}

    resp = requests_pkcs12.post(
        'http://9.176.47.41/creditreference/',
        # headers=header,
        # data=(data).encode('utf-8'),
        data='payload',
        pkcs12_filename=r'F:\Download\HMCCB_daiq.pfx',
        pkcs12_password='daiq123hmccb',
        verify=False)
    print("返回参数：", resp.text)
    print("状态码：", resp.status_code)


if __name__ == "__main__":
    sign1()
    # sign2()
